package com.lgl.scs.wx.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.lgl.scsapi.base.dao.DaoSupport;
import com.lgl.scsapi.system.model.AppUser;
import com.lgl.scsapi.system.model.PageData;
import com.lgl.scsapi.system.model.ServiceOrder;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * 微信小程序端订单处理service
 */

@Service("wxServiceOrderService")
public class WxServiceOrderService {
	@Resource(name = "daoSupport")
	private DaoSupport dao;

	/**
	 * 获取服务订单信息列表(前台移动端使用)
	 * @param pageData  参数,必须包含showCount(每页显示记录数)，currentPage(当前页号)这2个参数
	 * @return 分页PageInfo对象
	 */
	public PageInfo wxPageServiceOrder(PageData pageData) {
        int pageSize = Integer.parseInt(pageData.remove("showCount").toString()),
             pageNo = Integer.parseInt(pageData.remove("currentPage").toString());
        PageHelper.startPage(pageNo,pageSize);
        List<ServiceOrder> mOrderList = (List<ServiceOrder>) dao.findForList("WxServiceOrderMapper.wxPageServiceOrder", pageData);
	    return new PageInfo(mOrderList);
	}
	/**
	 * 获取服务订单信息列表(微信小程序使用)
	 * @param pageNo 页号
	 * @param pageSize  每页显示行数
	 * @param pageData  参数
	 * @return 分页PageInfo对象
	 */
	public PageInfo wxIndexPageOrder(int pageNo,int pageSize, PageData pageData) {
		PageHelper.startPage(pageNo,pageSize);
		List<PageData> wxOrderList = (List<PageData>) dao.findForList("WxServiceOrderMapper.wxIndexPageOrder", pageData);
		return new PageInfo(wxOrderList);
	}
	/**
	 * 取消未抢订单操作
	 * @param cancelUser 取消用户
	 * @param cancelPd 参数，包括单号
	 * @return 0:成功，1：失败
	 */
	public String cancelServiceOrder(AppUser cancelUser, PageData cancelPd){
		ServiceOrder cancelOrder = getServiceOrderByBillNumber(cancelPd);
		if (cancelOrder == null){
			return "2";
		}
		//如果不是未抢状态，则不能取消
		if (cancelOrder.getSoStatus() != 0){
			cancelPd.put("soStatus",cancelOrder.getSoStatus());
			return "3";
		}
		//如果订单发布人不是当前登录人，则不能取消
		if (!cancelOrder.getSoUserId().equals(cancelUser.getUserId())){
			return "4";
		}
		//要更新的状态，5：已取消
		cancelPd.put("soStatus","5");
		//where条件中的状态，只有未抢的单才能取消
		cancelPd.put("cancelSoStatus","0");
		cancelPd.put("issuerId", cancelUser.getUserId());
		int cancelRows = dao.update("WxServiceOrderMapper.cancelServiceOrder", cancelPd);
		//删除不用key
		cancelPd.remove("cancelSoStatus");
		cancelPd.remove("issuerId");
		cancelPd.remove("billId");
		return cancelRows > 0 ? "0" : "1";
	}

	/**
	 *通过订单号获取数据
	 * @param pd 查询PageData参数
	 * @return 订单对象
	 */
	public ServiceOrder getServiceOrderByBillNumber(PageData pd) {
		return (ServiceOrder) dao.findForObject("WxServiceOrderMapper.getServiceOrderByBillNumber", pd);
	}
    /**
     *通过订单号获取数据,与getServiceOrderByBillNumber的区别是：此方法的SQL中不会加for update
     * @param pd 查询PageData参数
     * @return 订单对象
     */
    public ServiceOrder getServiceOrder(PageData pd) {
        return (ServiceOrder) dao.findForObject("WxServiceOrderMapper.getServiceOrder", pd);
    }
	/**
	 * 抢单人完成服务订单
	 * @param robberUserId 抢单人ID
	 * @param robberDonePd 抢单参数PageData
	 * @return 完成/失败标识
	 */
	public String robberDoneOrder(String robberUserId,PageData robberDonePd){
		ServiceOrder doneOrder = getServiceOrderByBillNumber(robberDonePd);
		if (doneOrder == null){
			return "2";
		}
		//如果不是已抢未完成,则不执行完成操作
		if (!"1".equalsIgnoreCase(String.valueOf(doneOrder.getSoStatus()))){
			return "3";
		}
		//如果不是自己抢的,则不执行完成操作
		if (!doneOrder.getSoGetUser().equals(robberUserId)){
			return "4";
		}
		robberDonePd.put("oldSoStatus", "1");
		robberDonePd.put("soStatus", "4");
		robberDonePd.put("soGetUser", robberUserId);
		int robberDoneRow = dao.update("WxServiceOrderMapper.robberDoneOrder", robberDonePd);
		return robberDoneRow > 0 ? "0" : "1";
	}

	/**
	 * 修改订单信息（通用）
	 * @param pageData 修改的值，和where条件
	 * @return 成功修改的行数
	 */
	public int editServiceOrder(PageData pageData){
		return dao.update("WxServiceOrderMapper.editServiceOrder", pageData);
	}

	/**
	 * 抢服务订单
	 * @param robber 抢单者
	 * @param pageData 抢单相关参数
	 * @return 成功或失败
	 */
	public PageData robServiceOrder(AppUser robber, PageData pageData){
		String billId = pageData.getString("billId");
		if (!StringUtils.hasText(billId)){
			pageData.clear();
			pageData.put("status","6");
			return pageData;
		}
		ServiceOrder serviceOrder = getServiceOrderByBillNumber(pageData);
		//服务订单不存在
		if (serviceOrder == null){
			pageData.clear();
			pageData.put("status","3");
			return pageData;
		}
		//服务订单已抢
		if (serviceOrder.getSoStatus() != 0){
			pageData.clear();
			pageData.put("status","4");
			return pageData;
		}
		if (robber.getUserId().equals(serviceOrder.getSoUserId())){
			pageData.clear();
			pageData.put("status","5");
			return pageData;
		}
		//如果订单存在，并且还没被抢
		pageData.put("soStatus", "1");
		pageData.put("soGetUser", robber.getUserId());
		pageData.put("oldStatus","0");
		pageData.put("billId", billId);
		int row = dao.update("WxServiceOrderMapper.robServiceOrder", pageData);;
		pageData.clear();
		pageData.put("status", row > 0 ? "0" : "2");
        return pageData;
	}
    /**
     * 保存服务订单信息
     * @param serviceOrder 服务订单对象
     * @return 成功或失败
     */
    public boolean saveServiceOrder(ServiceOrder serviceOrder) {
        int row = dao.save("WxServiceOrderMapper.saveServiceOrder", serviceOrder);
        return row > 0;
    }
    /**
     * 获取我赚到的总钱数
     * @param userId 用户ID
     * @return 我赚到的总钱数
     */
    public String myMakeMoney(String userId){
        Object makeMoneyObj = dao.findForObject("WxServiceOrderMapper.myMakeMoney", userId);
        return makeMoneyObj.toString();
    }
}